/** ****************************************************************************
 * @file 	modbusport.hpp
 * @author 	mojinpan
 * @copyright copyright (c) 2018-2020 mojinpan. All rights reserved.
 * @brief 	modbus通讯接口抽象基类
 *
 * @version 	V1.0
 * @date 	2025-06-17
 * @details
 * 1.初稿
 *******************************************************************************/
#ifndef _MODBUS_PORT_H
#define _MODBUS_PORT_H

#include <vector>
#include <unordered_map>
#include <mutex>
#include <condition_variable>

#include "modbus.hpp"
#include "comm/comm.h"

class SerialPort : public ModbusPort, public comm_adapter::Comm::Parent
{
public:
    SerialPort(const std::string &port_name)
        : m_portName(port_name), m_comm(nullptr), m_isConnected(false) {}
    void registerContext(uint8_t addr, void *cxt); // 新增：注册实例地址映
    void unregisterContext(uint8_t addr);          // 新增：注销实例地址映射
private:
    virtual void onRecv(const std::string &from_who, const void *data_ptr, size_t data_size) override;
    virtual int recv(void *cxt, uint8_t *buf, size_t len) override;
    virtual int send(void *cxt, const uint8_t *buf, size_t len) override;
    // 新增成员变量
    std::string m_portName;                                      // 串口号（如"COM1"）
    comm_adapter::Comm *m_comm;                                  // 通信适配器实例
    std::vector<uint8_t> m_recvBuf;                              // 接收缓冲区
    std::unordered_map<uint8_t, void *> m_addrToCxt;             // 目标地址 -> Modbus实例指针
    std::unordered_map<void *, std::vector<uint8_t>> m_cxtToBuf; // Modbus实例指针 -> 专属缓冲区
    std::mutex m_mutex;                                          // 保证多线程安全
    std::condition_variable m_recvCond;                          // 条件变量用于接收阻塞

    bool m_isConnected;                                          // 连接状态
};

#endif
